--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
meshchatx/src/backend/announce_manager.py fa46dc4ce9ab50cbe66a7a9e4b3bca0140102345 (fa46dc4c) Text, 9.33 KB
T8b949e# SPDX-License-Identifier: 0BSD
Tff7b72import T7ee787base64
Tff7b72from T7ee787.T7ee787database Tff7b72import Te6edf3Database
Te6edf3_ASPECT_MAX_STORED_KEYS Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6fflxmf.deliveryTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffannounce_max_stored_lxmf_deliveryTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffnomadnetwork.nodeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffannounce_max_stored_nomadnetwork_nodeTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflxmf.propagationTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffannounce_max_stored_lxmf_propagationTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflxst.telephonyTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffannounce_max_stored_lxmf_deliveryTa5d6ff"Tb4b4b4,
Tb4b4b4}
Te6edf3_ASPECT_FETCH_LIMIT_KEYS Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6fflxmf.deliveryTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffannounce_fetch_limit_lxmf_deliveryTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffnomadnetwork.nodeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffannounce_fetch_limit_nomadnetwork_nodeTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflxmf.propagationTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffannounce_fetch_limit_lxmf_propagationTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflxst.telephonyTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffannounce_fetch_limit_lxmf_deliveryTa5d6ff"Tb4b4b4,
Tb4b4b4}
Te6edf3_ASPECT_STORE_ENABLE_KEYS Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6fflxmf.deliveryTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffannounce_store_lxmf_deliveryTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflxst.telephonyTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffannounce_store_lxst_telephonyTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffnomadnetwork.nodeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffannounce_store_nomadnetwork_nodeTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflxmf.propagationTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffannounce_store_lxmf_propagationTa5d6ff"Tb4b4b4,
Tb4b4b4}
Tff7b72class T56d364AnnounceManagerTb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dbTb4b4b4: Te6edf3DatabaseTb4b4b4, Te6edf3configTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdb Tff7b72= Te6edf3db
Tff7b72selfTff7b72.Td2a8ffconfig Tff7b72= Te6edf3config
Tff7b72def Td2a8ff_get_max_stored_for_aspectTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3aspectTb4b4b4)Tb4b4b4:
Te6edf3key Tff7b72= Te6edf3_ASPECT_MAX_STORED_KEYSTff7b72.Td2a8ffgetTb4b4b4(Te6edf3aspectTb4b4b4)
Tff7b72if Tff7b72not Te6edf3key Tff7b72or Tff7b72not Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4:
Tff7b72return Tff7b72None
Te6edf3attr Tff7b72= Tffa657getattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4, Te6edf3keyTb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72if Te6edf3attr Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72None
Te6edf3v Tff7b72= Te6edf3attrTff7b72.Td2a8ffgetTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3v Tff7b72is Tff7b72None Tff7b72or Te6edf3v Tff7b72< T79c0ff1Tb4b4b4:
Tff7b72return Tff7b72None
Tff7b72return Tffa657minTb4b4b4(Te6edf3vTb4b4b4, T79c0ff1_000_000Tb4b4b4)
Tff7b72def Td2a8ff_get_fetch_limit_for_aspectTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3aspectTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4:
Tff7b72return T79c0ff2500
Te6edf3key Tff7b72= Te6edf3_ASPECT_FETCH_LIMIT_KEYSTff7b72.Td2a8ffgetTb4b4b4(Te6edf3aspectTb4b4b4)
Tff7b72if Tff7b72not Te6edf3keyTb4b4b4:
Tff7b72return T79c0ff2500
Te6edf3attr Tff7b72= Tffa657getattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4, Te6edf3keyTb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72if Te6edf3attr Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return T79c0ff2500
Te6edf3v Tff7b72= Te6edf3attrTff7b72.Td2a8ffgetTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3v Tff7b72is Tff7b72None Tff7b72or Te6edf3v Tff7b72< T79c0ff1Tb4b4b4:
Tff7b72return T79c0ff2500
Tff7b72return Tffa657minTb4b4b4(Te6edf3vTb4b4b4, T79c0ff100_000Tb4b4b4)
Tff7b72def Td2a8ffis_storing_announce_for_aspectTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3aspectTb4b4b4, Te6edf3force_storeTb4b4b4: Tffa657bool Tff7b72= Tff7b72FalseTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
Tff7b72if Te6edf3force_store Tff7b72or Tff7b72not Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4:
Tff7b72return Tff7b72True
Te6edf3key Tff7b72= Te6edf3_ASPECT_STORE_ENABLE_KEYSTff7b72.Td2a8ffgetTb4b4b4(Te6edf3aspectTb4b4b4)
Tff7b72if Tff7b72not Te6edf3keyTb4b4b4:
Tff7b72return Tff7b72True
Te6edf3attr Tff7b72= Tffa657getattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4, Te6edf3keyTb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72if Te6edf3attr Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72True
Tff7b72return Tffa657boolTb4b4b4(Te6edf3attrTff7b72.Td2a8ffgetTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72def Td2a8ffupsert_announceTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3reticulumTb4b4b4,
Te6edf3identityTb4b4b4,
Te6edf3destination_hashTb4b4b4,
Te6edf3aspectTb4b4b4,
Te6edf3app_dataTb4b4b4,
Te6edf3announce_packet_hashTb4b4b4,
Te6edf3force_storeTb4b4b4: Tffa657bool Tff7b72= Tff7b72FalseTb4b4b4,
Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffis_storing_announce_for_aspectTb4b4b4(Te6edf3aspectTb4b4b4, Te6edf3force_storeTff7b72=Te6edf3force_storeTb4b4b4)Tb4b4b4:
Tff7b72return
Te6edf3rssi Tff7b72= Te6edf3snr Tff7b72= Te6edf3quality Tff7b72= Tff7b72None
Tff7b72if Te6edf3announce_packet_hash Tff7b72and Te6edf3reticulumTb4b4b4:
Te6edf3rssi Tff7b72= Te6edf3reticulumTff7b72.Td2a8ffget_packet_rssiTb4b4b4(Te6edf3announce_packet_hashTb4b4b4)
Te6edf3snr Tff7b72= Te6edf3reticulumTff7b72.Td2a8ffget_packet_snrTb4b4b4(Te6edf3announce_packet_hashTb4b4b4)
Te6edf3quality Tff7b72= Te6edf3reticulumTff7b72.Td2a8ffget_packet_qTb4b4b4(Te6edf3announce_packet_hashTb4b4b4)
Te6edf3data Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4: Te6edf3destination_hashTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3destination_hashTb4b4b4, Tffa657bytesTb4b4b4)
Tff7b72else Te6edf3destination_hashTb4b4b4,
Ta5d6ff"Ta5d6ffaspectTa5d6ff"Tb4b4b4: Te6edf3aspectTb4b4b4,
Ta5d6ff"Ta5d6ffidentity_hashTa5d6ff"Tb4b4b4: Te6edf3identityTff7b72.Td2a8ffhashTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffidentity_public_keyTa5d6ff"Tb4b4b4: Te6edf3base64Tff7b72.Td2a8ffb64encodeTb4b4b4(Te6edf3identityTff7b72.Td2a8ffget_public_keyTb4b4b4(Tb4b4b4)Tb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(
Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffrssiTa5d6ff"Tb4b4b4: Te6edf3rssiTb4b4b4,
Ta5d6ff"Ta5d6ffsnrTa5d6ff"Tb4b4b4: Te6edf3snrTb4b4b4,
Ta5d6ff"Ta5d6ffqualityTa5d6ff"Tb4b4b4: Te6edf3qualityTb4b4b4,
Tb4b4b4}
Tff7b72if Te6edf3app_data Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3dataTb4b4b4[Ta5d6ff"Ta5d6ffapp_dataTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3base64Tff7b72.Td2a8ffb64encodeTb4b4b4(Te6edf3app_dataTb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffannouncesTff7b72.Td2a8ffupsert_announceTb4b4b4(Te6edf3dataTb4b4b4)
Te6edf3max_stored Tff7b72= Tff7b72selfTff7b72.Td2a8ff_get_max_stored_for_aspectTb4b4b4(Te6edf3aspectTb4b4b4)
Tff7b72if Te6edf3max_stored Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffannouncesTff7b72.Td2a8fftrim_announces_for_aspectTb4b4b4(Te6edf3aspectTb4b4b4, Te6edf3max_storedTb4b4b4)
Tff7b72def Td2a8ffget_filtered_announcesTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3aspectTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3identity_hashTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3destination_hashTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3queryTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3blocked_identity_hashesTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3limitTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3offsetTff7b72=T79c0ff0Tb4b4b4,
Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3limit Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3limit Tff7b72= Tff7b72selfTff7b72.Td2a8ff_get_fetch_limit_for_aspectTb4b4b4(Te6edf3aspectTb4b4b4)
Te6edf3sql Tff7b72= Ta5d6ff"""
Ta5d6ff SELECT a.*, c.custom_image as contact_image
Ta5d6ff FROM announces a
Ta5d6ff LEFT JOIN contacts c ON (
Ta5d6ff a.identity_hash = c.remote_identity_hash OR
Ta5d6ff a.destination_hash = c.lxmf_address OR
Ta5d6ff a.destination_hash = c.lxst_address
Ta5d6ff )
Ta5d6ff WHERE 1=1
Ta5d6ff Ta5d6ff"""
Te6edf3params Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72if Te6edf3aspectTb4b4b4:
Te6edf3sql Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff AND a.aspect = ?Ta5d6ff"
Te6edf3paramsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3aspectTb4b4b4)
Tff7b72if Te6edf3identity_hashTb4b4b4:
Te6edf3sql Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff AND a.identity_hash = ?Ta5d6ff"
Te6edf3paramsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3identity_hashTb4b4b4)
Tff7b72if Te6edf3destination_hashTb4b4b4:
Te6edf3sql Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff AND a.destination_hash = ?Ta5d6ff"
Te6edf3paramsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tff7b72if Te6edf3queryTb4b4b4:
Te6edf3like_term Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff%Tffd700{Te6edf3queryTffd700}Ta5d6ff%Ta5d6ff"
Te6edf3sql Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff AND (a.destination_hash LIKE ? OR a.identity_hash LIKE ?)Ta5d6ff"
Te6edf3paramsTff7b72.Td2a8ffextendTb4b4b4(Tb4b4b4[Te6edf3like_termTb4b4b4, Te6edf3like_termTb4b4b4]Tb4b4b4)
Tff7b72if Te6edf3blocked_identity_hashesTb4b4b4:
Te6edf3placeholders Tff7b72= Ta5d6ff"Ta5d6ff, Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Tb4b4b4[Ta5d6ff"Ta5d6ff?Ta5d6ff"Tb4b4b4] Tff7b72* Tffa657lenTb4b4b4(Te6edf3blocked_identity_hashesTb4b4b4)Tb4b4b4)
Te6edf3sql Tff7b72+Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff AND a.identity_hash NOT IN (Tffd700{Te6edf3placeholdersTffd700}Ta5d6ff)Ta5d6ff"
Te6edf3paramsTff7b72.Td2a8ffextendTb4b4b4(Te6edf3blocked_identity_hashesTb4b4b4)
Te6edf3sql Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff ORDER BY a.updated_at DESCTa5d6ff"
Tff7b72if Te6edf3limit Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3sql Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff LIMIT ? OFFSET ?Ta5d6ff"
Te6edf3paramsTff7b72.Td2a8ffextendTb4b4b4(Tb4b4b4[Te6edf3limitTb4b4b4, Te6edf3offsetTb4b4b4]Tb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffproviderTff7b72.Td2a8fffetchallTb4b4b4(Te6edf3sqlTb4b4b4, Te6edf3paramsTb4b4b4)
Tff7b72def Td2a8ffget_filtered_announces_countTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3aspectTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3identity_hashTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3destination_hashTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3queryTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3blocked_identity_hashesTff7b72=Tff7b72NoneTb4b4b4,
Tb4b4b4)Tb4b4b4:
Te6edf3sql Tff7b72= Ta5d6ff"""
Ta5d6ff SELECT COUNT(*) as count
Ta5d6ff FROM announces a
Ta5d6ff LEFT JOIN contacts c ON (
Ta5d6ff a.identity_hash = c.remote_identity_hash OR
Ta5d6ff a.destination_hash = c.lxmf_address OR
Ta5d6ff a.destination_hash = c.lxst_address
Ta5d6ff )
Ta5d6ff WHERE 1=1
Ta5d6ff Ta5d6ff"""
Te6edf3params Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72if Te6edf3aspectTb4b4b4:
Te6edf3sql Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff AND a.aspect = ?Ta5d6ff"
Te6edf3paramsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3aspectTb4b4b4)
Tff7b72if Te6edf3identity_hashTb4b4b4:
Te6edf3sql Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff AND a.identity_hash = ?Ta5d6ff"
Te6edf3paramsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3identity_hashTb4b4b4)
Tff7b72if Te6edf3destination_hashTb4b4b4:
Te6edf3sql Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff AND a.destination_hash = ?Ta5d6ff"
Te6edf3paramsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tff7b72if Te6edf3queryTb4b4b4:
Te6edf3like_term Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff%Tffd700{Te6edf3queryTffd700}Ta5d6ff%Ta5d6ff"
Te6edf3sql Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff AND (a.destination_hash LIKE ? OR a.identity_hash LIKE ?)Ta5d6ff"
Te6edf3paramsTff7b72.Td2a8ffextendTb4b4b4(Tb4b4b4[Te6edf3like_termTb4b4b4, Te6edf3like_termTb4b4b4]Tb4b4b4)
Tff7b72if Te6edf3blocked_identity_hashesTb4b4b4:
Te6edf3placeholders Tff7b72= Ta5d6ff"Ta5d6ff, Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Tb4b4b4[Ta5d6ff"Ta5d6ff?Ta5d6ff"Tb4b4b4] Tff7b72* Tffa657lenTb4b4b4(Te6edf3blocked_identity_hashesTb4b4b4)Tb4b4b4)
Te6edf3sql Tff7b72+Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff AND a.identity_hash NOT IN (Tffd700{Te6edf3placeholdersTffd700}Ta5d6ff)Ta5d6ff"
Te6edf3paramsTff7b72.Td2a8ffextendTb4b4b4(Te6edf3blocked_identity_hashesTb4b4b4)
Te6edf3result Tff7b72= Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffproviderTff7b72.Td2a8fffetchoneTb4b4b4(Te6edf3sqlTb4b4b4, Te6edf3paramsTb4b4b4)
Tff7b72return Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6ffcountTa5d6ff"Tb4b4b4] Tff7b72if Te6edf3result Tff7b72else T79c0ff0
Tff7b72def Td2a8ffget_announces_for_destination_hashesTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3destination_hashesTb4b4b4,
Te6edf3aspectsTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3blocked_identity_hashesTff7b72=Tff7b72NoneTb4b4b4,
Tb4b4b4)Tb4b4b4:
T8b949e"""Return announce rows for many destination hashes (visualiser bulk query)."""
Tff7b72if Tff7b72not Te6edf3destination_hashesTb4b4b4:
Tff7b72return Tb4b4b4[Tb4b4b4]
Te6edf3aspect_list Tff7b72= Te6edf3aspects Tff7b72or Tb4b4b4[Ta5d6ff"Ta5d6fflxmf.deliveryTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffnomadnetwork.nodeTa5d6ff"Tb4b4b4]
Te6edf3hash_list Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3seen Tff7b72= Tffa657setTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3raw Tff7b72in Te6edf3destination_hashesTb4b4b4:
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3rawTb4b4b4, Tffa657strTb4b4b4)Tb4b4b4:
Tff7b72continue
Te6edf3h Tff7b72= Te6edf3rawTff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3h Tff7b72or Te6edf3h Tff7b72in Te6edf3seenTb4b4b4:
Tff7b72continue
Te6edf3seenTff7b72.Td2a8ffaddTb4b4b4(Te6edf3hTb4b4b4)
Te6edf3hash_listTff7b72.Td2a8ffappendTb4b4b4(Te6edf3hTb4b4b4)
Tff7b72if Tff7b72not Te6edf3hash_listTb4b4b4:
Tff7b72return Tb4b4b4[Tb4b4b4]
Te6edf3chunk_size Tff7b72= T79c0ff400
Te6edf3out Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3aspect Tff7b72in Te6edf3aspect_listTb4b4b4:
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3aspectTb4b4b4, Tffa657strTb4b4b4) Tff7b72or Tff7b72not Te6edf3aspectTb4b4b4:
Tff7b72continue
Tff7b72for Te6edf3offset Tff7b72in Tffa657rangeTb4b4b4(T79c0ff0Tb4b4b4, Tffa657lenTb4b4b4(Te6edf3hash_listTb4b4b4)Tb4b4b4, Te6edf3chunk_sizeTb4b4b4)Tb4b4b4:
Te6edf3chunk Tff7b72= Te6edf3hash_listTb4b4b4[Te6edf3offset Tb4b4b4: Te6edf3offset Tff7b72+ Te6edf3chunk_sizeTb4b4b4]
Te6edf3placeholders Tff7b72= Ta5d6ff"Ta5d6ff, Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Tb4b4b4[Ta5d6ff"Ta5d6ff?Ta5d6ff"Tb4b4b4] Tff7b72* Tffa657lenTb4b4b4(Te6edf3chunkTb4b4b4)Tb4b4b4)
Te6edf3sql Tff7b72= Ta5d6fffTa5d6ff"""
Ta5d6ff SELECT a.*, c.custom_image as contact_image
Ta5d6ff FROM announces a
Ta5d6ff LEFT JOIN contacts c ON (
Ta5d6ff a.identity_hash = c.remote_identity_hash OR
Ta5d6ff a.destination_hash = c.lxmf_address OR
Ta5d6ff a.destination_hash = c.lxst_address
Ta5d6ff )
Ta5d6ff WHERE a.aspect = ?
Ta5d6ff AND a.destination_hash IN (Tffd700{Te6edf3placeholdersTffd700}Ta5d6ff)
Ta5d6ff Ta5d6ff"""
Te6edf3params Tff7b72= Tb4b4b4[Te6edf3aspectTb4b4b4, Tff7b72*Te6edf3chunkTb4b4b4]
Tff7b72if Te6edf3blocked_identity_hashesTb4b4b4:
Te6edf3blocked_placeholders Tff7b72= Ta5d6ff"Ta5d6ff, Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(
Tb4b4b4[Ta5d6ff"Ta5d6ff?Ta5d6ff"Tb4b4b4] Tff7b72* Tffa657lenTb4b4b4(Te6edf3blocked_identity_hashesTb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3sql Tff7b72+Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff AND a.identity_hash NOT IN (Tffd700{Te6edf3blocked_placeholdersTffd700}Ta5d6ff)Ta5d6ff"
Te6edf3paramsTff7b72.Td2a8ffextendTb4b4b4(Te6edf3blocked_identity_hashesTb4b4b4)
Te6edf3sql Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff ORDER BY a.updated_at DESCTa5d6ff"
Te6edf3outTff7b72.Td2a8ffextendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdbTff7b72.Td2a8ffproviderTff7b72.Td2a8fffetchallTb4b4b4(Te6edf3sqlTb4b4b4, Te6edf3paramsTb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3out
Tff7b72def Td2a8fffilter_announced_dicts_by_search_queryTb4b4b4(
Te6edf3itemsTb4b4b4: Tffa657listTb4b4b4[Tffa657dictTb4b4b4]Tb4b4b4,
Te6edf3search_queryTb4b4b4: Tffa657strTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Tffa657listTb4b4b4[Tffa657dictTb4b4b4]Tb4b4b4:
T8b949e"""Case-insensitive substring match on display name, hashes, and custom display name."""
Te6edf3q Tff7b72= Te6edf3search_queryTff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Tff7b72return Tb4b4b4[
Te6edf3a
Tff7b72for Te6edf3a Tff7b72in Te6edf3items
Tff7b72if Tb4b4b4(
Tb4b4b4(Te6edf3aTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffdisplay_nameTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3q Tff7b72in Te6edf3aTb4b4b4[Ta5d6ff"Ta5d6ffdisplay_nameTa5d6ff"Tb4b4b4]Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72or Tb4b4b4(Te6edf3aTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3q Tff7b72in Te6edf3aTb4b4b4[Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4]Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72or Tb4b4b4(Te6edf3aTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffidentity_hashTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3q Tff7b72in Te6edf3aTb4b4b4[Ta5d6ff"Ta5d6ffidentity_hashTa5d6ff"Tb4b4b4]Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72or Tb4b4b4(Te6edf3aTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffcustom_display_nameTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3q Tff7b72in Te6edf3aTb4b4b4[Ta5d6ff"Ta5d6ffcustom_display_nameTa5d6ff"Tb4b4b4]Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4)
Tb4b4b4]
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────